/**
 * @description 分装ajax接口
 */
// 引入axios
import axios from 'axios'
//  引入store获取缓存数据
import store from '../store'

// 实现请求拦截，封装固定参数
const Axios = axios.create({
  timeout: 5000,
  baseURL: '/apis'
})

// 发起请求之前拦截
// 请求前的拦截，需要返回数据config，才会继续发出请求
Axios.interceptors.request.use(function (config) {
  // 如果token不存在，直接抛出一个错误，然后借宿请求
  // let token = this.$store. 因为这个不是vue组件，所以this没有$store对象，所以要引入store实例
  // 那么所有非要拦截的接口，都应该在请求前就要保证vuex中有一个token数据
  const token = store.getters['common/getToken']
  // 对所有接口进行拦截。不是所有的接口都需要拦截
  // 则需要对请求地址进行过滤，
  // 定义一个数组，然后把所有的不需要拦截地址在这里进行定义
  const otherPath = ['/user/app/code', '/user/app/login', '/user/app/register']
  // let otherPath = []
  // 如果请求地址包含在其中，那么这个请求就不需要拦截
  if (otherPath.includes(config.url)) {
    return config
  } else {
    // 如果需要拦截，则需要对token进行校验
    // 如果不存在，直接返回一个错误信息
    if (!token) {
      return Promise.reject({ code: 400, message: '当前用户没有登录，所以不能发出异步请求' })
    } else {
      // 可以对config数据进行加工，添加上token数据
      config.headers.token = token
      // 直接发出请求
      return config
    }
  }
})

// 请求之后拦截
// use 需要传递一个函数，这个函数要求返回一个Promise或则是一个对象(Promise | any)
// 函数会有一个响应对象形参，然后可以通过对形参的data对象处理，实现通用业务的一个拦截处理
Axios.interceptors.response.use(function (response) {
  if (response.data.code === 403) {
    return Promise.reject('用户的token错误或已失效，需要用户重新登录获取新的token')
  } else {
    return response
  }
})

// 封装一个ajax请求方法
function ajaxFunc (req) {
  // 如果url地址没有传递，直接报错 --js是主线程运行应用，所以可以使用异常抛出中断当前的线程
  if (!req.url) {
    throw new SyntaxError('请求的url参数是必传的')
  }
  // 当传递url地址再进行下面的操作
  return new Promise(resolve => {
    // axios.request({
    Axios.request({
      // 设置请求地址
      url: req.url,
      method: req.method || 'GET',
      // 所有的请求都加上一个/apis，然后服务器会把它进行一个代理
      // baseURL: '/apis',
      // 请求头
      headers: { token: 'test token' },
      // 设置请求超时
      // timeout: 5000,
      // params参数配置 -- 它的参数会自动拼接到ulr地址上
      params: req.params || {},
      // data参数 --不能在get请求中使用，它是请求体参数
      data: req.data || {}
    }).then(({ data }) => {
      resolve(data)
    }).catch(e => {
      console.log('-----请求失败')
      resolve(e)
    })
  })
}

export default ajaxFunc
